#翁家能
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sympy.physics.control.control_plots import matplotlib

# 设置全局字体为支持中文的字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号

# 初始化pro接口
pro = ts.pro_api('3c10d058d82ed3ba65f48fea982907dbd1c53349bd224d335d086d64')

# 拉取数据
df = pro.daily(**{
    "ts_code": "",
    "trade_date": "",
    "start_date": "",
    "end_date": "",
    "offset": "",
    "limit": ""
}, fields=[
    "ts_code",
    "trade_date",
    "open",
    "high",
    "low",
    "close",
    "pre_close",
    "change",
    "pct_chg",
    "vol",
    "amount"
])
# 打印数据
print("原始数据：")
print(df)

# 数据分析
# 1. 基本统计信息
print("\n基本统计信息：")
print(df.describe())

# 2. 缺失值检查
print("\n缺失值检查：")
print(df.isnull().sum())

# 3. 数据分布
print("\n数据分布：")
print(df[['open', 'high', 'low', 'close', 'change', 'pct_chg', 'vol', 'amount']].describe())

# 4. 涨跌幅分析
print("\n涨跌幅分析：")
print(f"平均涨跌幅：{df['pct_chg'].mean():.2f}%")
print(f"最大涨跌幅：{df['pct_chg'].max():.2f}%")
print(f"最小涨跌幅：{df['pct_chg'].min():.2f}%")

# 5. 成交量和成交额分析
print("\n成交量和成交额分析：")
print(f"平均成交量：{df['vol'].mean():.2f}手")
print(f"最大成交量：{df['vol'].max():.2f}手")
print(f"最小成交量：{df['vol'].min():.2f}手")
print(f"平均成交额：{df['amount'].mean():.2f}元")
print(f"最大成交额：{df['amount'].max():.2f}元")
print(f"最小成交额：{df['amount'].min():.2f}元")

# 数据可视化
# 1. 涨跌幅分布
plt.figure(figsize=(10, 6))
sns.histplot(df['pct_chg'], kde=True, bins=30)
plt.title('涨跌幅分布')
plt.xlabel('涨跌幅 (%)')
plt.ylabel('频率')
plt.show()

# 2. 成交量分布
plt.figure(figsize=(10, 6))
sns.histplot(df['vol'], kde=True, bins=30)
plt.title('成交量分布')
plt.xlabel('成交量 (手)')
plt.ylabel('频率')
plt.show()

# 3. 成交额分布
plt.figure(figsize=(10, 6))
sns.histplot(df['amount'], kde=True, bins=30)
plt.title('成交额分布')
plt.xlabel('成交额 (元)')
plt.ylabel('频率')
plt.show()

# 4. 开盘价、最高价、最低价、收盘价的对比
plt.figure(figsize=(10, 6))
df[['open', 'high', 'low', 'close']].plot(kind='box')
plt.title('开盘价、最高价、最低价、收盘价的对比')
plt.ylabel('价格')
plt.show()




# 数据预处理
# 确保日期是 datetime 类型
df['trade_date'] = pd.to_datetime(df['trade_date'])

# 按日期排序
df.sort_values(by='trade_date', inplace=True)

# 计算 MA5 和 MA10
df['MA5'] = df['close'].rolling(window=5).mean()
df['MA10'] = df['close'].rolling(window=10).mean()

# 计算 RSI
def calculate_rsi(series, window=14):
    delta = series.diff().dropna()
    ups, downs = delta.copy(), delta.copy()
    ups[ups < 0] = 0
    downs[downs > 0] = 0
    roll_up = ups.rolling(window).mean()
    roll_down = downs.rolling(window).mean().abs()
    RS = roll_up / roll_down
    RSI = 100.0 - (100.0 / (1.0 + RS))
    return RSI

df['RSI'] = calculate_rsi(df['close'], window=14)

# 打印处理后的数据
print("处理后的数据：")
print(df)

# 保存处理后的数据到 CSV 文件
df.to_csv('processed_stock_data.csv', index=False)

plt.figure(figsize=(14, 7))
plt.plot(df['trade_date'], df['close'], label='收盘价', color='blue')
plt.plot(df['trade_date'], df['MA5'], label='MA5', color='orange')
plt.plot(df['trade_date'], df['MA10'], label='MA10', color='green')
plt.title('收盘价与 MA5、MA10')
plt.xlabel('日期')
plt.ylabel('价格')
plt.legend()
plt.show()

plt.figure(figsize=(14, 7))
plt.plot(df['trade_date'], df['RSI'], label='RSI', color='red')
plt.axhline(y=70, color='r', linestyle='--', label='超买线 (70)')
plt.axhline(y=30, color='g', linestyle='--', label='超卖线 (30)')
plt.title('RSI 指标')
plt.xlabel('日期')
plt.ylabel('RSI 值')
plt.legend()
plt.show()





# 找到 MA5 上穿 MA10 的点
# 通过比较 MA5 和 MA10 的差值的正负变化来判断上穿
df['MA5_MA10_diff'] = df['MA5'] - df['MA10']
df['MA5_MA10_diff_shift'] = df['MA5_MA10_diff'].shift(1)

# 找到 MA5 大于 MA10 且前一行 MA5 小于 MA10 的点
buy_points = df[(df['MA5'] > df['MA10']) & (df['MA5_MA10_diff_shift'] < 0)]

# 打印买点股票
print("买点股票列表：")
print(buy_points)


